package com.ctl.juc.queue;

import java.util.concurrent.LinkedTransferQueue;

/**
 * 是一个由链表结构组成的无界阻塞 TransferQueue 队列。相对于其他阻塞队列，
 * LinkedTransferQueue 多了 tryTransfer 和 transfer 方法。
 * 1. transfer 方法：如果当前有消费者正在等待接收元素（消费者使用 take()方法或带时间限制的
 * poll()方法时），transfer 方法可以把生产者传入的元素立刻 transfer（传输）给消费者。如
 * 果没有消费者在等待接收元素，transfer 方法会将元素存放在队列的 tail 节点，并等到该元素
 * 被消费者消费了才返回。
 * 2. tryTransfer 方法。则是用来试探下生产者传入的元素是否能直接传给消费者。如果没有消费
 * 者等待接收元素，则返回 false。和 transfer 方法的区别是 tryTransfer 方法无论消费者是否
 * 接收，方法立即返回。而 transfer 方法是必须等到消费者消费了才返回。
 * 对于带有时间限制的 tryTransfer(E e, long timeout, TimeUnit unit)方法，则是试图把生产者传
 * 入的元素直接传给消费者，但是如果没有消费者消费该元素则等待指定的时间再返回，如果超时
 * 还没消费元素，则返回 false，如果在超时时间内消费了元素，则返回 true。
 */
public class LinkedTransferQueueTest {
    private volatile static  int i=0;
    private volatile static  int j=0;
    private volatile static  int m=1111;
    public static void main(String[] args) {
        LinkedTransferQueue<Integer> linkedTransferQueue = new LinkedTransferQueue();
        new Thread(()->{
            for (int k = 0; k <100 ; k++) {
                try {
                    linkedTransferQueue.transfer(i++);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }).start();
        new Thread(()->{
            for (int k = 0; k <100 ; k++) {
                try {
                    linkedTransferQueue.transfer(j--);

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }).start();

        new Thread(()->{
            for (int k = 0; k <100 ; k++) {
                try {
                    Integer i=linkedTransferQueue.take();
                    System.out.println(i);
                } catch (InterruptedException e) {

                }
            }
        }).start();

        for (int k = 0; k <100 ; k++) {
            try {
                Integer i=linkedTransferQueue.take();
                System.out.println(i);
            } catch (InterruptedException e) {

            }
        }
    }
}
